-- =============================================================================
-- 面向对象

-- -- 创建一个名称为 animal 的对象
-- animal = {
--     name = "Tom",
--     asg = 5,
--     bark = function (self, voice)
--         print(self.name.."在"..voice.."叫")
--     end
-- }

-- animal.bark(animal,"狗") -- Tom在狗叫

-- animal2 = animal

-- -- 将 animal 置空
-- animal = nil
-- animal2.bark(animal2,"狗")



-- ===============================================================================
-- -- 创建一个类
-- Animal = {
--     name = "no_name",
--     age = 0
-- } 

-- function Animal: bark(voice)
--     print(self.name.."在"..voice.."叫")
-- end

-- -- 为该类添加一个无参构造器
-- function Animal: new()
--     -- 创建一个类
--     local a = {}

--     -- 为新表指定元表为当前基础类表
--     -- 在新表中找不到的key，会从 self 基础类表中查找
--     setmetatable(a,{__index=self})

--     -- 返回新表
--     return a
-- end

-- -- 为该类添加一个带参构造器（下面举例是参数为 table 的情况）
-- function Animal: new(obj)
--     local a = obj or {}
--     setmetatable(a,{__index=self})
--     -- 返回新表
--     return a
-- end

-- animal = Animal: new()
-- animal2 = Animal: new()
-- animal3= Animal: new({type="老鼠"})

-- -- print(animal)
-- -- print(animal2)

-- animal.name = "Tom"
-- animal.age = 5
-- animal.type = "狗"

-- print(animal.name.."今年"..animal.age.."岁，它是一只"..animal.type) -- Tom今年5岁，它是一只狗

-- animal3.name = "Jerry"
-- animal3.age = 10
-- print(animal3.name.."今年"..animal3.age.."岁，它是一只"..animal3.type) -- Jerry今年10岁，它是一只老鼠

-- ===============================================================================
-- 创建一个类
Animal = {
    name = "no_name",
    age = 0
} 

function Animal: bark(voice)
    print(self.name.."在"..voice.."叫")
end

-- 为该类添加一个无参构造器
function Animal: new()
    -- 创建一个类
    local a = {}

    -- 为新表指定元表为当前基础类表
    -- 在新表中找不到的key，会从 self 基础类表中查找
    setmetatable(a,{__index=self})

    -- 返回新表
    return a
end

-- 为该类添加一个带参构造器（下面举例是参数为 table 的情况）
function Animal: new(obj)
    local a = obj or {}
    setmetatable(a,{__index=self})
    -- 返回新表
    return a
end

-- 为 Animal 类创建一个子类 Cat
Cat = Animal: new({type="波斯猫"})

Cat.eyes = "蓝眼睛"

tomcat = Cat: new()
tomcat.name = "Tom"
tomcat.age = 20
print(tomcat.name.."今年"..tomcat.age.."岁，它是一只"..tomcat.type) -- Tom今年20岁，它是一只波斯猫\

print(tomcat:bark("喵喵")) -- Tom在喵喵叫